﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections;

namespace Network_Toolbox.src
{
    class Inventaire
    {
        private String nom;
        private List<Equipement> tab_equipements;

        public Inventaire(String nom)
        {
            this.nom = nom;
            this.tab_equipements = new List<Equipement>();

        }

        public void ajoutEquipement(Equipement e)
        {
            this.tab_equipements.Add(e);
        }

        public void ajoutEquipement(String ip, String user, String mdp, String mdpen, String communaute, String typeCon)
        {
            this.tab_equipements.Add(new Equipement(ip, user, mdp, mdpen, communaute, typeCon));
        }

        public void ajoutEquipement(String ip, String communaute)
        {
            this.tab_equipements.Add(new Equipement(ip, communaute));
        }

        public void ajoutEquipement(String nom, String ip, String user, String mdp, String mdp_enable, String communaute, String type_connexion, String serial_number, String description, Port[] tab_ports_voisins, int nb_voisin)
        {
            this.tab_equipements.Add(new Equipement (nom, ip, user, mdp, mdp_enable, communaute, type_connexion, serial_number, description, tab_ports_voisins, nb_voisin));
        }

        public void suppEquipement(String ip)
        {
            Equipement equipSupp = null;

            foreach(Equipement e in this.tab_equipements)
            {
                if (e.getIp().Equals(ip))
                {
                    equipSupp = e;
                }
            }
            if (equipSupp != null)
            {
                this.tab_equipements.Remove(equipSupp);
            }
            
        }

        public String getNom()
        {
            return this.nom;
        }

        public List<Equipement> getTab_equipements()
        {
            return this.tab_equipements;
        }

        public void discoverSnmpInvent()
        {
            bool equipPresent = false;
            bool echecSNMP = false;
            String messErr = "";
            List<Equipement> tab_equipTemp = new List<Equipement>();

            //discover SNMP de tous les équipements
            foreach (Equipement e in this.tab_equipements)
            {
                try
                {
                    e.discoverSNMP();
                }
                catch (Exception except)
                {
                    echecSNMP = true;
                    messErr = messErr + except.Message+"\n";
                }
                
                }


                // Recherche de nouveaux equipements dans les voisins découverts
                // Pour chaque equipements de l'inventaire
                foreach (Equipement e in this.tab_equipements)
                {
                    if (e.getNom() != null)
                    {
                        // Pour chaque voisin
                        foreach (Port p in e.getTab_ports_voisins())
                        {
                            // remise a zero pour la recherche
                            equipPresent = false;
                            if (p != null)
                            {
                                //Nous allons parcourir a nouveau dans l'inventaire s'il est présent
                                foreach (Equipement eBis in this.tab_equipements)
                                {
                                    if (eBis.getNom() != null)
                                    {
                                        if (eBis.getNom().Equals(p.getEquipement_voisin()))
                                        {
                                            equipPresent = true;
                                        }
                                    }
                                }

                                // A la fin du parcours de l'inventaire
                                // si pas présent on l'ajoute (le nouveau)
                                if (equipPresent)
                                {
                                    //rien
                                }
                                else
                                {
                                    // insertion sans doublons
                                    Equipement equipAInserer = new Equipement(p.getEquipement_voisin());
                                    bool inserer = true;
                                    foreach (Equipement equip in tab_equipTemp)
                                    {
                                        if (equip.Equals(equipAInserer))
                                        {
                                            inserer = false;
                                        }
                                    }
                                    if (inserer)
                                    {
                                        tab_equipTemp.Add(equipAInserer);
                                    }
                                    equipPresent = false;
                                }
                            }
                        }
                    }
                }
                this.tab_equipements = this.tab_equipements.Concat(tab_equipTemp).ToList();
                if (echecSNMP)
                {
                    throw new Exception(messErr);
                }
            }

        public void chargerFichierOld(String chemin_fichier)
        {
            StreamReader readerFichier = new StreamReader(chemin_fichier);
            String ligne = readerFichier.ReadLine();
            Regex maRegleSplit = new Regex(@";");

            while (ligne != null)
            {
                //String temp_ligne = new String(ligne.ToCharArray());
                String[] tab_temp1 = { "12","user", "mdp", "mdpen", "comm", "con" };
                String temp_ligne = new String(ligne.ToCharArray());
                tab_temp1 = maRegleSplit.Split(temp_ligne);
                this.ajoutEquipement(tab_temp1[0],tab_temp1[1],tab_temp1[2],tab_temp1[3],tab_temp1[4],tab_temp1[5]);
                ligne = readerFichier.ReadLine();
            }
        }

        public void chargerFichier(String chemin_fichier)
        {
            // Pour la fin du code => création du tableau de port
            Port[] tab_ports_voisins;
            int nb_voisin = 0;
            Regex regleSplitVoisin = new Regex(@" \|\| ");
            Regex regleSplitRecupInfos = new Regex(@" : ");
            String[] unVoisin = new String[2];

            StreamReader readerFichier = new StreamReader(chemin_fichier);
            // Lecture de la première ligne du fichier
            String ligne = readerFichier.ReadLine();
            // Règle qui va permettre le découpage de chaque ligne
            Regex maRegleSplit = new Regex(@";");

            //Réalisation de la première découpe pour connaitre le que contienent les colonnes
            String[] tab_temp = maRegleSplit.Split(ligne);

            // passage du nom des colonnes en minuscules
            for (int i = 0; i < tab_temp.Length; i++)
            {
                tab_temp[i] = tab_temp[i].ToLower();
            }

            //création du tableau qui contiendra les infos de l'équipement
            Hashtable info_equip  = new Hashtable();

            //Ensuite on va passer sur chaque ligne afin de créer tout les equipements
            ligne = readerFichier.ReadLine();
            while (ligne != null)
            {
                // ??? ne sais plus pourquoi ????
                //String temp_ligne = new String(ligne.ToCharArray());
                String[] tab_temp1 = maRegleSplit.Split(ligne);
                for(int j = 0 ; j < tab_temp1.Length; j++)
                {
                    info_equip.Add(tab_temp[j], tab_temp1[j]);
                }
                // ajout des colones qui ne serait pas présentes
                if (!info_equip.ContainsKey("nom"))
                {
                    info_equip.Add("nom", "");
                }
                if (!info_equip.ContainsKey("ip"))
                {
                    info_equip.Add("ip", "");
                }
                if (!info_equip.ContainsKey("user"))
                {
                    info_equip.Add("user", "");
                }
                if (!info_equip.ContainsKey("mot de passe"))
                {
                    info_equip.Add("mot de passe", "");
                }
                if (!info_equip.ContainsKey("mot de passe enable"))
                {
                    info_equip.Add("mot de passe enable", "");
                }
                if (!info_equip.ContainsKey("communaute"))
                {
                    info_equip.Add("communaute", "");
                }
                if (!info_equip.ContainsKey("type connexion"))
                {
                    info_equip.Add("type connexion", "");
                }
                if (!info_equip.ContainsKey("serial number"))
                {
                    info_equip.Add("serial number", "");
                }
                if (!info_equip.ContainsKey("description"))
                {
                    info_equip.Add("description", "");
                }

                // Création du tableau de ports
                if (info_equip.ContainsKey("voisins") && !((String)info_equip["voisins"]).Equals(""))
                {
                    String[] tabVoisin = regleSplitVoisin.Split((String)info_equip["voisins"]);
                    tab_ports_voisins = new Port[tabVoisin.Length];
                    for (int k = 0; k < tabVoisin.Length; k++)
                    {
                        unVoisin = regleSplitRecupInfos.Split(tabVoisin[k]);
                        Port voisin = new Port(unVoisin[0], unVoisin[1]);
                        tab_ports_voisins[nb_voisin] = voisin;
                        nb_voisin++;
                    }
                }
                else if (!info_equip.ContainsKey("voisins"))
                {
                    info_equip.Add("voisins", "");
                    tab_ports_voisins = new Port[200];
                    nb_voisin = 0;
                }
                else
                {
                    tab_ports_voisins = new Port[200];
                    nb_voisin = 0;
                }

                //Ajout de l'equipement
                this.ajoutEquipement((String)info_equip["nom"], (String)info_equip["ip"], (String)info_equip["user"], (String)info_equip["mot de passe"], (String)info_equip["mot de passe enable"], (String)info_equip["communaute"], (String)info_equip["type connexion"], (String)info_equip["serial number"], (String)info_equip["description"], tab_ports_voisins, nb_voisin);
                //nettoyage des information pour le prochain equipement
                info_equip.Clear();
                nb_voisin = 0;
                // lecture de la ligne suivante (equipement suivant)
                ligne = readerFichier.ReadLine();
            }
        }

        public void chargerPlageAdresseIP(String ip, String communaute)
        {
                this.ajoutEquipement(ip,communaute);
        }
    }
}
